Row polymorphism
列多相
必要なフィールドの存在だけを要求するRecordの型を書ける
PureScriptのRecordで使える
OCamlにもあるらしい
structural subtypingにも似ている
{ a :: A | r }と書けば、
{ a :: A}は許容する
{ a :: A, b :: B }も許容する
{ b :: B, c :: C}は許容しない
row
key/typesの集合
e.g. { x : Int, y : Int }
row variable
まだ分からない残りのフィールドを表す変数
例
code:purs(hs)
{ x : Int | r }
x : Int は必須
r は、row variableで、他にどんなフィールドがあってもよいことを表す
フィールド追加も表現できる
code:purs(hs)
addY : { x : Int | r } -> { x : Int, y : Int | r }
フィールド削除も表現できる
code:purs(hs)
removeY : { y : Int | r } -> { r }
#wip
日本語でなぜ列多相と呼ぶのか
http://msakai.jp/d/20070704.html
Row Types
Row polymorphismとstructural subtypingの違い
参考
https://en.wikipedia.org/wiki/Row_polymorphism
https://hgiasac.github.io/posts/2018-11-18-Record-Row-Type-and-Row-Polymorphism.html
https://kmizu.hatenablog.com/entry/2017/07/31/155629
http://osiire.hatenablog.com/entry/20081129
https://github.com/purescript/documentation/blob/master/language/Types.md#row-polymorphism
https://github.com/ghc-proposals/ghc-proposals/pull/180
hsに入れるproposal